package com.example.staff.hub.view.impl;

import com.example.staff.hub.dao.IStaffDao;
import com.example.staff.hub.dao.impl.StaffDaoImpl;
import com.example.staff.hub.entity.Staff;
import com.example.staff.hub.view.IStaffView;

import java.time.LocalDate;
import java.util.Scanner;

/**
 * 员工视图接口实现类
 */
public class StaffViewImpl implements IStaffView {

    /**
     * 创建一个Scanner对象，用于从控制台获取用户输入
     */
    private Scanner scanner = new Scanner(System.in);

    /**
     * 创建一个IStaffDao接口的实例，用于执行与员工相关的数据访问
     */
    private IStaffDao staffDao = new StaffDaoImpl();

    @Override
    public void showWelcome() {
        System.out.println("欢迎使用StaffHub员工信息管理系统");
        System.out.println("数据库信息：" + staffDao.getDatabaseInfo());
        System.out.println("提示：按下 Ctrl+C 或输入 /exit 可退出系统");
        System.out.println();
    }

    @Override
    public int showMainMenu() {
        System.out.println("1. 添加员工信息");
        System.out.println("2. 删除员工信息");
        System.out.println("3. 修改员工信息");
        System.out.println("4. 查询员工信息");
        System.out.println("5. 查询所有员工信息");
        System.out.println("6. 退出");

        String label = "请输入操作编号：";
        String regexp = "^[1-6]$";
        String input = input(label, regexp);
        System.out.println();
        if (input == null) {
            return 6;
        }
        return Integer.parseInt(input);
    }

    @Override
    public void showAddNew() {
        // 打印添加员工信息的开始提示
        System.out.println("开始添加员工信息……");

        // 输入员工ID，并根据正则表达式验证
        String id = input("请输入员工ID：", "^[1-9]\\d*$");
        // 输入并验证员工姓名
        String name = input("请输入员工姓名：", "^[\\u4e00-\\u9fa5A-Za-z0-9 ··]{2,16}$");
        // 输入并验证员工性别
        String gender = input("请输入员工性别（0=女，1=男）：", "^[0-1]$");
        // 输入并验证员工出生日期
        String dayOfBirth = input("请输入员工出生日期（格式为yyyy-MM-dd）：", "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$");
        // 输入并验证员工电话号码
        String phone = input("请输入员工手机号码：", "^1[3-9]\\d{9}$");
        // 输入并验证员工电子邮件地址
        String email = input("请输入员工电子邮箱：", "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
        // 输入并验证员工家庭住址
        String address = input("请输入员工家庭住址：", "^.{2,100}$");
        // 输入并验证员工状态
        String status = input("请输入员工状态（0=离职，1=在职）：", "^[0-1]$");

        // 使用从input方法获取的数据创建一个新的Staff对象
        // 这里将字符串类型的gender和status转换为Int类型，并将dayOfBirth转换为LocalDate类型
        Staff staff = new Staff(
                id,
                name,
                Integer.parseInt(gender),
                LocalDate.parse(dayOfBirth),
                phone,
                email,
                address,
                Integer.parseInt(status)
        );

        // 调用staffDao的add方法将Staff对象添加到数据库中
        staffDao.addNew(staff);

        // 打印添加员工信息成功的提示
        System.out.println("添加员工信息成功！");
    }

    @Override
    public void showDeleteById() {
        System.out.println("StaffViewImpl.showDeleteById");
    }

    @Override
    public void showUpdateById() {
        System.out.println("StaffViewImpl.showUpdateById");
    }

    @Override
    public void showFindById() {
        // 打印查询员工信息的开始提示
        System.out.println("开始查询员工信息……");

        // 调用input方法输入员工ID，使用正则表达式验证ID格式，不允许空值
        String id = input("请输入员工ID：", "^[1-9]\\d*$");

        // 通过员工ID调用staffDao的findById方法查询员工信息
        Staff staff = staffDao.findById(id);

        // 检查查询结果是否为空，如果为空则打印错误信息并返回
        if (staff == null) {
            System.out.println("错误：尝试查询的员工信息不存在！");
            return;
        }

        // 打印查询到的员工信息
        System.out.println(staff);
    }

    @Override
    public void showFindAll() {
        // 打印查询所有员工信息的开始提示
        System.out.println("开始查询所有员工信息……");
        // 调用staffDao的findAll方法查询所有员工信息，并使用forEach方法逐个打印出来
        staffDao.findAll().forEach(System.out::println);
        // 打印查询结束的消息
        System.out.println("查询结束");
    }

    @Override
    public void showExit() {
        // 感谢用户使用StaffHub员工信息管理系统，并准备退出程序
        System.out.println("感谢使用StaffHub员工信息管理系统");
        // 退出程序
        System.exit(0);
    }

    /**
     * 从控制台获取符合指定正则表达式的用户输入，允许通过输入"/exit"退出
     *
     * @param label      用户输入前的提示文本，会直接显示在控制台
     * @param regexp     用于验证输入合法性的正则表达式
     * @return 符合正则表达式的输入字符串，如果用户放弃输入则返回null，如果允许为空且用户输入为空字符串则返回空字符串
     */
    private String input(String label, String regexp) {
        // 显示提示信息
        System.out.println(label);
        String input;
        while (true) {
            // 持续读取输入直到符合正则表达式或收到退出指令
            input = scanner.nextLine();
            // 检测退出指令（不区分大小写）
            if ("/exit".equals(input.toLowerCase())) {
                // 显示退出信息
                showExit();
                // 退出函数，返回null
                return null;
            }
            // 判断数据格式是否正确
            if (input.matches(regexp)) {
                // 输入符合预期，返回用户输入
                return input;
            } else {
                // 输入不符合预期，提示用户重新输入
                System.out.println("输入有误，请重新输入！");
            }
        }
    }

}